package com.itheima.filter;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.coyote.Request;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;



import java.io.IOException;
                                   // 表示拦截所有请求
 @WebFilter(urlPatterns = "/*") // 拦截路径,当发送的请求url符合此路径,请求将会被过滤器拦截,
@Slf4j
public class LoginFiler implements Filter {

    @Autowired
    private ObjectMapper objectMapper;
    /**
     * 当拦截到请求之后,执行此方法
     * @param request 请求对象
     * @param response 响应对象
     * @param filterChain 过滤器对象,用来放行
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        // 变量强转
        HttpServletRequest req = (HttpServletRequest) request;

        // 1.获取请求url             .toString 转换成String类型
        String url = req.getRequestURL().toString();

        // 2.判断请求url是否包含login,如果包含,说明是登录操作,放行
if (url.contains("login")){
    filterChain.doFilter(request,response); // 放行
}else {

    // 3.获取请求头中的令牌(token)
    String jwt = req.getHeader("token");
    // 4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
    if (!StringUtils.hasText(jwt)){
        Result result = Result.error("NOT_LOGIN");
        // 参数1:响应输出流.参数2:要转换成json的对象
        // 含义:将参数2的Result对象转换json通过参数1的响应输出流发送给客户端
        objectMapper.writeValue(response.getWriter(),result);
        return; // 阻止
    }
    // 5.解析token,如果解析失败,返回错误结果(未登录)
    try {
        JwtUtils.parseJWT(jwt);
    } catch (Exception e) {
        e.printStackTrace(); // 出现异常就表示校验失败,返回未登录的错误信息
        Result result = Result.error("NOT_LOGIN");
        // 参数1:响应输出流.参数2:要转换成json的对象
        // 含义:将参数2的Result对象转换成json通过参数1的响应输出流发送给客户端
        objectMapper.writeValue(response.getWriter(),result);
        return; // 阻止
    }
    // 6.放行
    filterChain.doFilter(request,response); // 放行
}


    }

}
